package com.example.demo.testcontroller;

import com.lee.forum.common.AppResult;
import com.lee.forum.common.ResultCode;
import com.lee.forum.dao.UserMapper;
import com.lee.forum.exception.ApplicationException;
import com.lee.forum.model.User;
import com.lee.forum.utils.MD5Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lishuo
 * Date: 2024-03-07
 * Time: 18:22
 */
@Service
@Slf4j
public class TestService1 {
    // 注入Dao层的数据库实例，这个对象用于操作数据库
    @Resource
    private UserMapper userMapper;

    // service层的登录方法
    public User login(String phonenumber, String password) {
        // 1.参数校验
        if (phonenumber == null  || phonenumber.length() == 0 || password == null || password.length() == 0) {
            // 打印日志
            log.warn("参数校验失败");
            // 抛出异常（ApplicationException是我自定义的一个异常，假设程序中做了统一异常处理，）
            throw new ApplicationException(AppResult.failed("参数校验失败"));
        }
        // 2.根据用户名查询用户信息(这里是调用Dao层的数据库操作方法，查询数据库)
        User user = userMapper.selectByPhonenumber(phonenumber);
        // 3.判断用户是否存在
        if (user == null) {
            // 打印日志
            log.warn("登录失败，用户不存在：phonenumber = "+phonenumber);
            // 抛出异常
            throw new ApplicationException(AppResult.failed("登录失败，用户不存在：phonenumber = "+phonenumber));
        }
        // 4.验证密码是否正确
        // 这里假设注册的时候为了加密存储，使用的是自定义的加盐算法
        // 那么在登录的时候，同样要
        String encrptPassword = MD5Util.md5Salt(password,user.getSalt());
        if (!encrptPassword.equalsIgnoreCase(user.getPassword())) {
            // 打印日志
            log.warn(ResultCode.FAILED_LOGIN.toString()+"密码错误:phonenumber = "+phonenumber);
            // 抛出异常
            throw new ApplicationException(AppResult.failed("登录失败，用户名或密码错误"));
        }
        // 5.登录成功，返回用户信息，便于在session中存储
        // 打印日志
        log.info("登录成功：phonenumber = " + phonenumber);
        return user;
    }
}
